Mikmak Model Customer met scaffolding
De model klasse voor de Customer entiteit
Probleem
Bij het toevoegen of wijzigen van een klant zijn er enkele regels waarmee we rekening moeten houden. De validatie hiervan gebeurt in deze Model klasse in de setters. Verder gaan we scaffolding gebruiken om de Views, Controllers en tabel te genereren. We voegen dus ook toe welke kolommen door scoffolding herkend moeten worden.
Design
We baseren ons op het Mikmak logisch model voor Customer om de model klasse te implementeren.
Oplossing
- Maak een bestand met de naam Customer.cs in de Models map. Kopieer het Mikmak Model UnitBase model en pas het aan voor Customer.
- Maak daarin een klasse met de naam
Customer
. - Maak voor elke kolom in de tabel een getter/setter property:
- Het gegevenstype van SQL moet je in overeenstemming brengen met het C# gevenstype. Hoe je SQL gegevenstypes in overeenstemming brengt met C# gegevenstypes lees je in EF entiteiten. Maar SQL beschikt over veel meer gegevenstypes dan C#. Hoe je die extra informatie (o.a. lengte, variabel, nationale karakters) van SQL kunt overbrengen naar C# en omgekeerd, lees je in EF object relational mapping met attributen. In de Customer tabel zit een foreign key naar de
Country
tabel. We hebben dus een referenceproperty nodig, en niet alleen eenvoudige scalaire eigenschappen. Hoe dat doet lees je in EF entiteiten. - Tenslotte voeg je de businessregels van het conceptueel model (o.a. verplichte kolommen, unieke waarden, displaynaam, primary key) toe. Hoe je dat doet lees je in EF Business regels toevoegen met attributen.
- Entity Framework veronderstelt dat elke entiteit een sleutel waarde heeft waarmee het entiteiten kan identificeren. Bij conventie is een PK een eigenschap met de naam "Id" of een eigenschap met het [Key] attribuut. En een FK een eigenschap bestaat bij conventie uit de naam van de entiteit waarnaar de FK verwijst gevolgd door "id", zoals "CountriesId" combineert. Deze afspraak komt niet overeen met ons Mikmak logisch model. In de toekomst zal ik dat aanpassen. Ondertussen passen we dat in de modelklasse aan. De reference property is gemarkeerd.
using System; using System.ComponentModel.DataAnnotations; namespace Webwinkel.Models { public class Customer { // fields protected String nickName; protected String firstName; protected String lastName; protected String address1; protected String address2; protected String city; protected String region; protected String postalCode; protected Int32 idCountry; protected String phone; protected String mobile; protected Int32 id; // Getters and setters [Display(Name = "Roepnaam")] [ScaffoldColumn(true)] [Required] [MaxLength(10, ErrorMessage = "Roepnaam bestaat uit maximum 10 karakters.")] public String NickName { get { return this.nickName; } set { this.nickName = value; } } [Display(Name = "Voornaam")] [ScaffoldColumn(true)] [Required] [MaxLength(255, ErrorMessage = "Voornaam bestaat uit maximum 255 karakters.")] public String FirstName { get { return this.firstName; } set { this.firstName = value; } } [Display(Name = "Familienaam")] [ScaffoldColumn(true)] [Required] [MaxLength(255, ErrorMessage = "Familienaam bestaat uit maximum 255 karakters.")] public String LastName { get { return this.lastName; } set { this.lastName = value; } } [Display(Name = "Adres 1")] [ScaffoldColumn(true)] [Required] [MaxLength(255, ErrorMessage = "Addres 1 bestaat uit maximum 255 karakters.")] public String Address1 { get { return this.address1; } set { this.address1 = value; } } [Display(Name = "Adres 2")] [ScaffoldColumn(true)] [MaxLength(255, ErrorMessage = "Addres 2 bestaat uit maximum 255 karakters.")] public String Address2 { get { return this.address2; } set { this.address2 = value; } } [Display(Name = "Stad")] [ScaffoldColumn(true)] [Required] [MaxLength(255, ErrorMessage = "Stad bestaat uit maximum 255 karakters.")] public String City { get { return this.city; } set { this.city = value; } } [Display(Name = "Regio")] [ScaffoldColumn(true)] [MaxLength(80, ErrorMessage = "Regio bestaat uit maximum 80 karakters.")] public String Region { get { return this.region; } set { this.region = value; } } [ScaffoldColumn(true)] [Display(Name = "Kies een land")] public int CountriesId { get { return this.idCountry; } set { this.idCountry = value; } } [Display(Name = "Postcode")] [ScaffoldColumn(true)] [Required] [MaxLength(20, ErrorMessage = "Postcode bestaat uit maximum 20 karakters.")] public String PostalCode { get { return this.postalCode; } set { this.postalCode = value; } } [Display(Name = "Vaste telefoon")] [ScaffoldColumn(true)] [MaxLength(40, ErrorMessage = "Phone bestaat uit maximum 40 karakters.")] public String Phone { get { return this.phone; } set { this.phone = value; } } [Display(Name = "Mobieltje")] [ScaffoldColumn(true)] [MaxLength(40, ErrorMessage = "Mobile bestaat uit maximum 40 karakters.")] public String Mobile { get { return this.mobile; } set { this.mobile = value; } } [Key] [ScaffoldColumn(false)] [Required] public Int32 Id { get { return this.id; } set { this.id = value; } } public virtual Country Countries { get; set; } } }
- Referentie naar de model klassen toevoegen:
voor elke entiteit moet je een referenctie naar de model klasse toevoegen; meer uitleg hierover vind je in EF context
de referentie naarCustomer
:using System.Data.Entity; namespace Webwinkel.Models { public class Dal : DbContext { public Dal() : base("name=WebwinkelWindowsAuthentication") { } public virtual DbSet<UnitBase> DbSetUnitBase { get; set; } public virtual DbSet<Country> DbSetCountry { get; set; } public virtual DbSet<Customer> DbSetCustomer { get; set; } } }
2016-11-28 13:10:31